package org.batatasframework.support.database;

import org.batatasframework.support.database.jdbc.ConnectionAccessor;
import org.batatasframework.support.database.sql.TableRuntimeMaster;

import cn.bonoon.kernel.support.IOperator;
import cn.bonoon.kernel.util.StringHelper;

/**
 * <pre>具体的一个被查询的表；
 * 被查询的这个表可能是分表，与表结构的定义并不一定是相同的。
 * 
 * 数据库查询的目标表需要在执行时，由具体的生成策略来生成；参考：
 * 
 * 
 * 具体被查询处理的数据库表，与定义中的数据库表可能不一致；
 * 如：分表的情况，表定义相同，实际查询则是根据当前用户的定义来决定读取哪一张表
 * 
 * 这个对象应该在生成查询语句的时候被生成的，因为如果需要进行uion连表的话，
 * 这个时候才能决定有需要读取多少个表，而且是从哪一个控制器里读取的数据</pre>
 * 
 * 
 * 
 * @author jackson
 *
 */
public class IdentifyTable extends IdentifyTableBase implements AutoCloseable{

	private final ConnectionAccessor connectionAccessor;
	private final IOperator operator;
	
	private String extTable;
	
	/**
	 * 被查询的表与定义的表是同一个表；
	 * 默认的情况下
	 */
	public IdentifyTable(TableRuntimeMaster masterTableRuntime, ConnectionAccessor connectionAccessor, IOperator operator){
		super(masterTableRuntime);
		
		this.connectionAccessor = connectionAccessor;
		this.operator = operator;
	}
	
	public void setExtTable(String extTable) {
		this.extTable = extTable;
	}
	
	@Override
	public String toString() {
		return StringHelper.get(extTable, super.toString());
	}
	
	/**
	 * <pre>
	 * 被查询的表与定义的表可能不同库，需要具体指定某一个数据库和指定具体查询的表名
	 * 
	 * TODO 重点注意
	 * 注意：这种情况下不同的数据库必须都在同一个数据库服务器上，如果不在。。。目前还没法处理
	 * </pre>
	 */
	public IdentifyTable(TableRuntimeMaster masterTableRuntime, ConnectionAccessor connectionAccessor, IOperator operator, TableInfo tableInfo, IdentifyJoin... joins){
		super(masterTableRuntime, tableInfo, joins);
		
		this.connectionAccessor = connectionAccessor;
		this.operator = operator;
	}
	
	/** 这个数据库连接器可能是连接不同的数据库服务器 */
	public ConnectionAccessor getConnectionAccessor() {
		return connectionAccessor;
	}
	
	public IOperator getOperator() {
		return operator;
	}

	@Override
	public void close() throws Exception {
		// TODO Auto-generated method stub
		
	}
}
